#include <STC/STC89C5xRC.H>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DU = P2 ^ 6; // 数码管段选
sbit WE = P2 ^ 7; // 位选

/**
 * 共阴数码管段选表 0~9
 */
uchar code table[] = {
	0x3f,
	0x06,
	0x5b,
	0x4f,
	0x66,
	0x6d,
	0x7d,
	0x07,
	0x7f,
	0x6f,
};

/**
 * 毫秒级延时
 * 12T
 * Fosc = 11.0592 MHz
 * @param ms 延时毫秒数，设定的取值范围：0~65535
 */
void delay(uint ms)
{
	uint x, y;
	for (x = ms; x > 0; x--)
		for (y = 114; y > 0; y--)
			;
}

/**
 * 数码管显示
 * @param i 显示的数值，取值范围 0~999
 */
void display(uint i)
{
	uchar
		bai = i / 100,		// 236 / 100 = 2
		shi = i % 100 / 10, // 236 % 100 / 10 = 3
		ge = i % 10;		// 236 % 10 = 6

	// 第一位数码管
	P0 = 0xff; // 清除段码
	WE = 1;
	P0 = 0xfe;
	WE = 0;

	DU = 1;
	P0 = table[bai];
	DU = 0;

	delay(5);

	// 第二位数码管
	P0 = 0xff;
	WE = 1;
	P0 = 0xfd; // 1111 1101
	WE = 0;

	DU = 1;
	P0 = table[shi];
	DU = 0;

	delay(5);

	// 第三位数码管
	P0 = 0xff;
	WE = 1;
	P0 = 0xfb; // 1111 1011
	WE = 0;

	DU = 1;
	P0 = table[ge];
	DU = 0;

	delay(5);
}

/**
 * 动态显示共阴数码管前三位
 */
void main()
{
	display(236); // Init.
}
